<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    //promise.all()关注多个promise对象的状态变化
    //传入多个promise实例，包装成一个新的promise实例返回
    const delay=ms=>{
      return new Promise(resolve=>{
        setTimeout(() => {
          resolve()
        }, ms);
      })
    }
    const p1=delay(1000).then(()=>{
      console.log('p1完成了');
      // return 'p1'
      return Promise.reject('reason')
    }).catch(err=>console.log(err))
    const p2=delay(1000).then(()=>{
      console.log('p1完成了');
      return 'p1'
    }).catch(err=>console.log(err))
    //所有状态都变成resolved，最终的状态才会变成resolved
    //只要有一个变成rejected，最终的状态就变成rejected
    const p=Promise.all([p1,p2])
    p.then(data=>{
      console.log(data);
    },err=>{
      console.log(err);
    })
    //promise.reace()的状态取决于第一个完成的promise实例对象
    //如果第一个完成的成功了，那最终的就成功，如果第一个完成失败了，那最终就失败
    const racePromise=Promise.race([p1,p2])
    racePromise.then(
      data=>{
        console.log(data);
      },err=>{
        console.log(err);
      }
    )
    //promise.allSettled()的状态于传入的promise状态无关
    //永远都是成功的 它只会忠实的记录下各个promise的表现
    const allSettledPomise=Promise.allSettled([p1,p2])
    allSettledPomise.then(data=>{
      console.log('succ',data);
    })
    //三个方法的参数问题
    //参数如果不是promise数组，会将不是promise的数组元素转变成promise对象
    //不止是数组，任何可遍历的都可以作为参数
    Promise.all([1,2,4]).then(datas=>console.log(datas))
    //等价于
    Promise.all([Promise.resolve(1),Promise.resolve(2),Promise.resolve(3)])
    //错误即可以单独处理，也可以统一处理
    //一旦被处理，就不会在其他地方再处理一遍
    Promise.all([1,2,4]).then(datas=>console.log(datas)).catch(err=>console.log(err))
  </script>
</body>
</html>